// #include <stdio.h>
// #include <stdlib.h>
// #include <Windows.h>
//
// typedef char ElemType;
// // 节点结构
// typedef struct Node {
//     ElemType data;
//     struct Node* next;
// } Node;
//
// // 链表结构
// typedef struct LinkedList {
//     Node* head;  // 头结点
// } LinkedList;
//
// // 创建链表并初始化
// LinkedList* create_list() {
//     LinkedList* list = (LinkedList*)malloc(sizeof(LinkedList));
//     list->head = (Node*)malloc(sizeof(Node)); // 创建头结点
//     list->head->next = NULL;  // 初始化头结点的下一个指针
//     return list;
// }
//
// // 判断链表是否为空
// int is_empty(LinkedList* list) {
//     return list->head->next == NULL;
// }
//
// // 尾插法插入
// void insert_at_tail(LinkedList* list, ElemType data) {
//     Node* new_node = (Node*)malloc(sizeof(Node));
//     new_node->data = data;
//     new_node->next = NULL; // 新节点的下一个指针指向 NULL
//
//     Node* current = list->head;
//     while (current->next != NULL) {
//         current = current->next; // 找到最后一个节点
//     }
//     current->next = new_node; // 将新节点插入到链表末尾
// }
//
// // 显示链表内容
// void display(LinkedList* list) {
//     Node* current = list->head->next;
//     printf("链表内容: ");
//     while (current != NULL) {
//         printf("%c ", current->data);
//         current = current->next;
//     }
//     printf("\n");
// }
//
// // 释放链表内存
// void free_list(LinkedList* list) {
//     Node* current = list->head;
//     Node* next_node;
//     while (current != NULL) {
//         next_node = current->next;
//         free(current);
//         current = next_node;
//     }
// }
//
// //逆置表
// void Reverse(LinkedList* L) {
//     if(L==NULL||L->head==NULL) {
//         return;
//     }
//     Node* p=L->head->next;
//     Node* prev=NULL;
//     Node* next=NULL;
//     while (p!=NULL) {
//         next=p->next;
//         p->next=prev;
//         prev=p;
//         p=next;
//     }
//     L->head->next=prev;
// }
//
// void CommonBackValue(LinkedList* L1,LinkedList* L2) {
//     if(L1==NULL||L2==NULL||L1->head==NULL||L2->head==NULL) {
//         return;
//     }
//     //将两个表逆置
//     Reverse(L1);
//     Reverse(L2);
//     //开始
//     LinkedList* L3=create_list();
//     Node* p3=L3->head;
//     Node* p1=L1->head->next;
//     Node* p2=L2->head->next;
//     while (p1!=NULL&&p2!=NULL&&p1->data==p2->data) {
//             // printf("%c ",p1->data);
//             insert_at_tail(L3,p1->data);
//             p1=p1->next;
//             p2=p2->next;
//             p3=p3->next;
//     }
//     Reverse(L3);
//     printf("相同后缀");display(L3);
//     free(L3);
// }
//
// int main() {
//     SetConsoleOutputCP(CP_UTF8);
//     LinkedList* L=create_list();
//     insert_at_tail(L,'l');
//     insert_at_tail(L,'o');
//     insert_at_tail(L,'a');
//     insert_at_tail(L,'d');
//     insert_at_tail(L,'i');
//     insert_at_tail(L,'n');
//     insert_at_tail(L,'g');
//
//     LinkedList* L2=create_list();
//     insert_at_tail(L2,'b');
//     insert_at_tail(L2,'e');
//     insert_at_tail(L2,'i');
//     insert_at_tail(L2,'n');
//     insert_at_tail(L2,'g');
//
//     printf("L");display(L);
//     printf("L2");display(L2);
//     CommonBackValue(L,L2);
//
//     free_list(L);
//     free_list(L2);
//
//     return 0;
// }